package com.wanglin.reggie.common;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import java.sql.SQLIntegrityConstraintViolationException;

/**
 * GlobalExceptionHandler
 *
 * @author 王林
 * @version 1.0
 * @description
 * @date 2025/5/28 14:39
 * @projectName reggie_take_out
 * @package com.wanglin.reggie.common
 * @className com.wanglin.reggie.common.GlobalExceptionHandler
 * @copyright Copyright 2020 Theofanis, Wang Lin All rights reserved.
 */

/**
 * 全局异常处理
 */
@ControllerAdvice(annotations = {RestController.class, Controller.class}) // 指定该类为全局异常处理类，只处理带有 @RestController 或 @Controller 注解的类
@ResponseBody // 返回 JSON 数据
@Slf4j // 日志注解
public class GlobalExceptionHandler {
    // TODO: 2025/5/28
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class) // 捕获 SQLIntegrityConstraintViolationException 异常
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex) {
        log.error(ex.getMessage()); // 记录异常信息
        if (ex.getMessage().contains("Duplicate entry")) { // 判断异常信息中是否包含 Duplicate entry
            String[] split = ex.getMessage().split(" ");
            String msg = split[2] + "已存在"; // 获取重复的值，并拼接成提示信息
            return R.error(msg); // 返回错误信息
        }
        return R.error("未知异常，请联系管理员"); // 返回未知异常信息
    }

    @ExceptionHandler(CustomException.class) // 捕获 CustomException 异常
    public R<String> exceptionHandler(CustomException ex) {
        log.error(ex.getMessage()); // 记录异常信息
        return R.error(ex.getMessage()); // 返回自定义异常信息
    }
}
